home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / delicious_bookmarks-2.0.64-fx.xpi / chrome / deliciousBookmarks.jar / content / menubarutils.js < prev    next >
Encoding:
Text File  |  2008-06-19  |  12.9 KB  |  382 lines

  1. var ybookmark_Utils = {
  2.  
  3.   getAllTags: function() {
  4.     return ybookmarksMain.gBookmarks.getTags(null, {});
  5.   },
  6.  
  7.   getPopularTags: function(aCount) {
  8.  
  9.     if ( !aCount ) {
  10.       aCount = 20;
  11.     }
  12.     var result = new Array();
  13.     var topWindow = this._getTopWindow();
  14.     var order = "descending";
  15.     var column = topWindow.document.getElementById( "bookmark-tags-tree-count-col" );
  16.     var sortResource = column.getAttribute( "sort" );
  17.     var tree = topWindow.document.getElementById( "bookmark-tags-tree" );
  18.     tree.hidden = false;
  19.  
  20.     this._sortBookmarks( tree, column, sortResource, order );
  21.     var totalRows = tree.view.rowCount;
  22.     var tagColumn = tree.columns.getNamedColumn( "bookmark-tags-tree-tag-col" );
  23.      
  24.     for ( var counter = 0; counter < totalRows && counter < aCount; ++counter ) {
  25.       var tag = tree.view.getCellText ( counter, tagColumn );
  26.       result.push ( tag );
  27.     }
  28.  
  29.     return result;
  30.   },
  31.  
  32.   getBookmarksForTag: function(aTag) {
  33.     return ybookmarksMain.gBookmarks.getBookmarks(aTag, {});
  34.   },
  35.  
  36.   /* note that this function sorts the array in place */
  37.   sortBookmarks: function (bookmarks, aOrder) {
  38.     var func = null;
  39.  
  40.     if (aOrder == "chrono") {
  41.       func = function(a, b) { return a.added_date - b.added_date; };
  42.     } else if (aOrder == "chrono_reverse") {
  43.       func = function(a, b) { return b.added_date - a.added_date; };      
  44.     }
  45.  
  46.     if (func != null) {
  47.       bookmarks.sort(func);
  48.     }   
  49.   },
  50.   
  51.   _getIntersectingBookmarks: function(aArrays) {
  52.     var bookmarks = {};
  53.     var result = [];
  54.     
  55.     for (var i=0; i < aArrays.length; i ++) {
  56.       var array = aArrays[i];
  57.       for (var j=0; j < array.length; j++) {
  58.         var key = array[j].id;
  59.         if (bookmarks[key] == undefined) {
  60.           bookmarks[key] = { count: 1, 
  61.                              bm: array[j]};
  62.         } else {
  63.           bookmarks[key].count++;
  64.         }
  65.       }
  66.     }
  67.     
  68.     for each (var bm in bookmarks) {
  69.       if (bm.count == aArrays.length) {
  70.         result.push(bm.bm);
  71.       }
  72.     }
  73.     return result;
  74.   },
  75.   
  76.   /* returns a conjunction of the tags in the sorted order */
  77.   getBookmarksForTagOrdered: function(aTags, aOrder) {
  78.     try {
  79.       var tags = aTags.split(/\++/);
  80.       var args = [];
  81.     
  82.       for (var i=0; i < tags.length; i++) {
  83.         var t = tags[i];
  84.         if (t != "") {
  85.           args.push(this.getBookmarksForTag(t));
  86.         }
  87.       }
  88.     
  89.       var bm = this._getIntersectingBookmarks(args);
  90.       this.sortBookmarks(bm, aOrder);
  91.       return bm;
  92.     } catch (e) { 
  93.       yDebug.print("getBookmarksForTagOrdered(" + aTags + "): " + e);
  94.       return [];
  95.     }
  96.   },
  97.   
  98.   getSortedBookmarks: function(aSortColumn, aCount) {
  99.  
  100.     var result = new Array();
  101.     if ( !aCount ) {
  102.       // set it to max elements
  103.       aCount = 99999999999;
  104.     }
  105.  
  106.     var topWindow = this._getTopWindow();
  107.     var order = "descending";
  108.     var column = topWindow.document.getElementById( aSortColumn );
  109.     var sortResource = column.getAttribute( "sort" );
  110.     var tree = topWindow.document.getElementById( "bookmark-sort-tree" );
  111.     tree.hidden = false;
  112.  
  113.     this._sortBookmarks( tree, column, sortResource, order );
  114.     var totalRows = tree.view.rowCount;
  115.     var urlColumn = tree.columns.getNamedColumn( "bookmark-sort-tree-url-col" );
  116.      
  117.     var index = 0;
  118.     for ( var rowCounter = 0; rowCounter < totalRows && index < aCount; ++rowCounter ) {
  119.       var url = tree.view.getCellText ( rowCounter, urlColumn );
  120.  
  121.       var bookmark = ybookmarksMain.gBookmarks.getBookmark( url );
  122.       if (!bookmark || 
  123.           ybookmarksMain.gBookmarks.resolveBookmarkResourceType(ybookmarksMain.gBookmarks.isBookmarked(url)) == "LiveBookmark" ) {
  124.         continue;
  125.       }
  126.  
  127.       ++index;
  128.       result.push ( bookmark );
  129.     }
  130.  
  131.     return result;
  132.   },
  133.  
  134.   getFrequentBookmarks: function(aCount) {
  135.     return this.getSortedBookmarks ( "bookmark-sort-tree-visitcount-col", aCount );
  136.   },
  137.  
  138.   getRecentBookmarks: function(aCount) {
  139.     return this.getSortedBookmarks ( "bookmark-sort-tree-visitdate-col", aCount );
  140.   },
  141.  
  142.   getRecentlySavedBookmarks: function(aCount) {
  143.     return this.getSortedBookmarks ( "bookmark-sort-tree-adddate-col", aCount );
  144.   },
  145.  
  146.   addEmptyMenuItem: function(parent) {
  147.     var menuItem = this.createMenuItem("(Empty)", "", "", "" );
  148.     menuItem.setAttribute( "disabled", "true" );
  149.     parent.appendChild ( menuItem );
  150.   },
  151.  
  152.   removeAllMenuItems: function(menuPopup) {
  153.     while (menuPopup.firstChild) {
  154.       menuPopup.removeChild ( menuPopup.firstChild );
  155.     }
  156.   },
  157.  
  158.   getLinksForTag: function (tag) {
  159.     var linksForTags = {
  160.           "digital art": [
  161.                             { "link": "http://www.adobe.com",
  162.                               "title": "Adobe Tools"
  163.                             },
  164.                             { "link": "http://www.macromedia.com",
  165.                               "title": "Macromedia vector art tools"
  166.                             },
  167.                          ],
  168.           "photoshop": [
  169.                           { "link": "http://www.adobe.com",
  170.                             "title": "Adobe tools"
  171.                           },
  172.                           { "link": "http://store.adobe.com/type/index.html",
  173.                             "title": "Adobe type library"
  174.                           }
  175.                        ],
  176.           "illustration": [
  177.                           { "link": "http://www.adobe.com",
  178.                             "title": "Adobe tools"
  179.                           },
  180.                           { "link": "http://www.macromedia.com",
  181.                             "title": "macromedia vector art tools"
  182.                           }
  183.                        ]
  184.       };
  185.     if ( linksForTags[ tag ] )
  186.       return linksForTags[ tag ];
  187.  
  188.     return null;
  189.   },
  190.  
  191.   createMenuItem: function(aDisplayName, aAccessKey, aCommandName, aImage) {
  192.     var xulElement = document.createElementNS(gYBXUL_NS, "menuitem");
  193.     xulElement.setAttribute("label", aDisplayName);
  194.     xulElement.setAttribute("accesskey", aAccessKey);
  195.     xulElement.setAttribute("command", aCommandName);
  196.     xulElement.setAttribute("class", "menuitem-iconic bookmark-item");
  197.     xulElement.setAttribute("image", aImage);
  198.     return xulElement;
  199.   },
  200.   
  201.   _sortBookmarks: function(tree, column, sortResource, order ) {    
  202.     //To address changes in FF3
  203.     if(ybookmarksUtils.getFFMajorVersion() > 2) {
  204.         if(order == "descending") {
  205.             order = "ascending";
  206.         }
  207.         column.setAttribute( "sortDirection", order );           
  208.         tree.view.sort(column);     
  209.     } else {               
  210.         const nsIXULSortService = Components.interfaces.nsIXULSortService;
  211.         const isupports_uri = "@mozilla.org/xul/xul-sort-service;1";    
  212.         var xulSortService =
  213.                 Components.classes[isupports_uri].getService(nsIXULSortService);    
  214.         xulSortService.sort(tree, sortResource, order );
  215.         tree.builder.QueryInterface( Components.interfaces.nsIXULTreeBuilder ).sort( column );
  216.         column.setAttribute( "sortDirection", order );
  217.         column.setAttribute( "sortActive", "true" );
  218.         tree.builder.rebuild();
  219.     }
  220.     // tree.builder.refresh();
  221.   },
  222.  
  223.   _getTopWindow : function() {
  224.     var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
  225.     var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
  226.     var topWindow = windowManagerInterface.getMostRecentWindow( "navigator:browser" );
  227.   
  228.     return topWindow;
  229.   }
  230. };
  231.  
  232. const gYB_bms = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  233.   getService(Components.interfaces.nsIYBookmarksStoreService);
  234. const gYB_rdfs = Components.classes["@mozilla.org/rdf/rdf-service;1"].
  235.   getService(Components.interfaces.nsIRDFService);
  236. const gYB_rscIcon = gYB_rdfs.GetResource("http://home.netscape.com/NC-rdf#Icon");
  237.  
  238. function gYB_b64(aBytes) {
  239.   const B64_CHARS =
  240.   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  241.   var out = "", bits, i, j;
  242.  
  243.   var k = 0;
  244.   while ((aBytes.length - k) >= 3) {
  245.     bits = 0;
  246.     for (i = 0; i < 3; i++) {
  247.       bits <<= 8;
  248.       bits |= aBytes[k];
  249.       k++;
  250.     }
  251.     for (j = 18; j >= 0; j -= 6)
  252.       out += B64_CHARS[(bits>>j) & 0x3F];
  253.   }
  254.  
  255.   switch (aBytes.length - k) {
  256.     case 2:
  257.       out += B64_CHARS[(aBytes[k]>>2) & 0x3F];
  258.       out += B64_CHARS[((aBytes[k] & 0x03) << 4) | ((aBytes[k+1] >> 4) & 0x0F)];
  259.       out += B64_CHARS[((aBytes[k + 1] & 0x0F) << 2)];
  260.       out += "=";
  261.       break;
  262.     case 1:
  263.       out += B64_CHARS[(aBytes[k]>>2) & 0x3F];
  264.       out += B64_CHARS[(aBytes[k] & 0x03) << 4];
  265.       out += "==";
  266.       break;
  267.   }
  268.   return  out;
  269. }
  270.  
  271. function gYB_getMimeType(data, length) {
  272.   const catMgr = Components.classes["@mozilla.org/categorymanager;1"]
  273.     .getService(Components.interfaces.nsICategoryManager);
  274.   var sniffers = catMgr.enumerateCategory("content-sniffing-services");
  275.   var mimeType = null;
  276.   while (mimeType == null && sniffers.hasMoreElements()) {
  277.     var snifferCID = sniffers.getNext().QueryInterface(Components.interfaces.nsISupportsCString)
  278.       .toString();
  279.     var sniffer = Components.classes[snifferCID].getService(Components.interfaces.nsIContentSniffer);
  280.     try {
  281.       mimeType = sniffer.getMIMETypeFromContent(data, length);
  282.     } catch (e) {
  283.       mimeType = null;
  284.     }
  285.   }
  286.   return mimeType;
  287. }
  288.  
  289. function gYB_saveIcon(ds, resource, data, length) {
  290.   if (length > 0) {
  291.       var mimeType = gYB_getMimeType(data, length);
  292.       if (mimeType) {
  293.           var text = "data:" + mimeType + ";base64," + gYB_b64(data);
  294.           var oldIcon = ds.GetTarget(resource, gYB_rscIcon, true);
  295.           var newIcon = gYB_rdfs.GetLiteral(text);
  296.           if (oldIcon) {
  297.             ds.Change(resource, gYB_rscIcon, oldIcon, newIcon, true);
  298.           } else {
  299.             ds.Assert(resource, gYB_rscIcon, newIcon, true);
  300.           }
  301.       }
  302.    }
  303. }
  304.  
  305. function gYB_loadFavIconNew(url, favIconUrl) {
  306.   try {
  307.  
  308.     var resource = gYB_bms.isBookmarked(url);
  309.     
  310.     if (resource) {
  311.       //Increment visit count of the bookmarked url
  312.       var store = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  313.                                  getService(Components.interfaces.nsIYBookmarksStoreService);
  314.       store.incrementVisitCount( url );
  315.         
  316.       var out = { value : -1 };
  317.       var ds = gYB_bms.getDataSource();
  318.       var oldIcon = ds.GetTarget(resource, gYB_rscIcon, true);
  319.       if (!oldIcon || oldIcon.QueryInterface(Components.interfaces.nsIRDFLiteral).Value == "data:") {
  320.           /**
  321.            * Check for FF version
  322.            */
  323.           if(ybookmarksUtils.getFFMajorVersion() > 2) {
  324.             var faviconService = Components.classes["@mozilla.org/browser/favicon-service;1"]
  325.                                        .getService(Components.interfaces.nsIFaviconService);    
  326.             var ioservice = Components.classes["@mozilla.org/network/io-service;1"]
  327.                                       .getService(Components.interfaces.nsIIOService);
  328.             var pageURI = ioservice.newURI(url, null, null);
  329.             var faviconLink = faviconService.getFaviconImageForPage(pageURI);
  330.             
  331.             if(faviconLink.spec) {
  332.               var oldIcon = ds.GetTarget(resource, gYB_rscIcon, true);
  333.               var newIcon = gYB_rdfs.GetLiteral(faviconLink.spec);
  334.               if (oldIcon) {
  335.                 ds.Change(resource, gYB_rscIcon, oldIcon, newIcon, true);
  336.               } else {
  337.                 ds.Assert(resource, gYB_rscIcon, newIcon, true);
  338.               }
  339.             }
  340.           }
  341.         else {
  342.             var chan = IOSVC.newChannel(favIconUrl, null, null);
  343.             var listener = new bookmarksFavIconLoadListener(url, favIconUrl, chan);
  344.             listener.onStopRequestOld = listener.onStopRequest;
  345.             listener.onStopRequest = function(req, context, statusCode) {
  346.               try {
  347.                 gYB_saveIcon(ds, resource, this.mBytes, this.mCountRead);
  348.                 this.onStopRequestOld(req, context, statusCode);
  349.               } catch (e) {
  350.                  yDebug.print("Error in onStopRequest: " + e);
  351.               }
  352.             }
  353.             chan.notificationCallbacks = listener;
  354.             chan.asyncOpen(listener, null);
  355.         }
  356.         return true;
  357.       }
  358.     }
  359.     return false;
  360.   } catch (e) {
  361.     yDebug.print("loadFavIconNew failed: " + e);
  362.     return false;
  363.   }
  364. }
  365.  
  366. //check for FF version
  367. if(ybookmarksUtils.getFFMajorVersion() < 3) {
  368.     /**
  369.      * Intercept BookmarksUtils.loadFavIcon.
  370.      */
  371.     var gYB_loadFavIconOld = ybookmark_Utils._getTopWindow().BookmarksUtils.loadFavIcon;
  372.     
  373.     //Listen to favicon load only on standard mode.This is done for tracking visit count.
  374.     if(ybookmarksUtils.getExtensionMode() == YB_EXTENSION_MODE_STANDARD)  {
  375.         ybookmark_Utils._getTopWindow().BookmarksUtils.loadFavIcon =
  376.             function(url, favIconUrl) {
  377.               if (! gYB_loadFavIconNew(url, favIconUrl)) {
  378.                 gYB_loadFavIconOld(url, favIconUrl);
  379.               }
  380.             };
  381.     }
  382. }